/*
* Sun Public License Notice
*
* The contents of this file are subject to the Sun Public License
* Version 1.0 (the "License"). You may not use this file except in
* compliance with the License. A copy of the License is available at
* http://www.sun.com/
*
* The Original Code is Forte for Java, Community Edition. The Initial
* Developer of the Original Code is Sun Microsystems, Inc. Portions
* Copyright 1997-2000 Sun Microsystems, Inc. All Rights Reserved.
*/
package org.netbeans.modules.java;
import java.io.*;
import java.util.*;
import java.beans.*;
import javax.swing.text.*;
import javax.swing.event.ChangeListener;
import javax.swing.event.ChangeEvent;
import org.openide.TopManager;
import org.openide.cookies.*;
import org.openide.filesystems.*;
import org.openide.loaders.*;
import org.openide.nodes.*;
import org.openide.util.Task;
import org.openide.actions.OpenAction;
import org.openide.text.EditorSupport;
import org.openide.execution.NbClassLoader;
import org.openide.compiler.Compiler;
import org.openide.compiler.CompilerJob;
import org.openide.compiler.ExternalCompiler;
import org.openide.src.*;
import org.openide.src.nodes.SourceChildren;
import org.openide.src.nodes.SourceElementFilter;
import org.openide.src.nodes.ElementNodeFactory;
import org.openide.src.nodes.FilterFactory;
import org.openide.util.actions.SystemAction;
import org.openide.util.TaskListener;
import org.openide.util.WeakListener;
import org.openide.util.Utilities;
import org.netbeans.modules.java.settings.JavaSettings;
import org.netbeans.modules.java.settings.ExternalCompilerSettings;
/** Data object representing a Java source file, perhaps with associated class files.
* May be subclassed.
* @author Petr Hamernik, Jaroslav Tulach, Ian Formanek
*/
public class JavaDataObject extends MultiDataObject implements ElementCookie {
/** generated Serialized Version UID */
static final long serialVersionUID = -6035788991669336965L;
public static final byte CONNECT_NOT = 0;
public static final byte CONNECT_CONFIRM = 1;
public static final byte CONNECT_AUTO = 2;
public static final byte CONNECT_DEFAULT = CONNECT_CONFIRM;
private static final String EA_CONNECTION = "SourceSync"; // NOI18N
private static final String[] SKIP_REGISTRATION_PREFIX = { "java.", "javax."}; // NOI18N
transient protected JavaEditor editorSupport;
transient protected ExecSupport execSupport;
transient protected ConnectionSupport connectionSupport;
transient private JavaInstanceSupport instanceSupport;
transient protected SourceElement sourceElement;
transient protected AbstractNode alteranteParent;
transient SourceElementImpl sourceElementImpl;
transient private FileChangeListener fileChangeListener;
transient private FileChangeListener changeListenerHook;
private static JavaSettings jopts;
private static ExternalCompilerSettings ecopts;
/** Create new data object.
* @param pf primary file object for this data object (i.e. the source file)
* @param loader the associated loader
*/
public JavaDataObject(FileObject pf, MultiFileLoader loader) throws DataObjectExistsException {
super(pf, loader);
init();
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject();
init();
}
private void init() {
MultiDataObject.Entry entry = getPrimaryEntry();
CookieSet cookies = getCookieSet();
editorSupport = createJavaEditor ();
cookies.add(editorSupport);
sourceElementImpl = new SourceElementImpl(this);
sourceElement = new SourceElement(sourceElementImpl);
execSupport = new JavaExecSupport(entry);
cookies.add(execSupport);
cookies.add(new JCompilerSupport.Compile(entry));
cookies.add(new JCompilerSupport.Build(entry));
cookies.add(new JCompilerSupport.Clean(entry));
connectionSupport = new ConnectionSupport(entry,
new ConnectionCookie.Type[] { new JavaConnections.Type(JavaConnections.TYPE_ALL)});
cookies.add(connectionSupport);
cookies.add(connectionListener);
instanceSupport = new JavaInstanceSupport(entry);
updateInstanceCookie();
cookies.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent evt) {
sourceElementImpl.fireCookiesChange();
}
});
addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
String propName = evt.getPropertyName();
if ((propName == null) || (propName.equals(PROP_FILES))) {
updateInstanceCookie();
}
}
});
fileChangeListener = WeakListener.fileChange(changeListenerHook = new FileChangeAdapter() {
public void fileChanged(FileEvent e) {
if (!editorSupport.isDocumentLoaded()) {
SourceElementImpl src = getSourceElementImpl();
if (src.dataRef.get() != null) {
src.setDirty(true);
src.prepare();
}
}
}
}, entry.getFile());
addSourceChangeListener(null);
}
void updateInstanceCookie() {
CookieSet cookies = getCookieSet();
FileObject clazz = Util.findFile(getPrimaryFile(), JavaDataLoader.CLASS_EXTENSION);
JavaInstanceSupport prev = (JavaInstanceSupport) cookies.getCookie(InstanceCookie.class);
if ((prev == null) && (clazz != null)) {
cookies.add(instanceSupport);
}
else if ((prev != null) && (clazz == null)) {
cookies.remove(instanceSupport);
}
}
/** Attaches a file change listener to the primary (source) file.
* Optionally removes the listener from previously used file object.
* @param previousPrimary if not null, then the method removes change listener from this
* file object.
*/
void addSourceChangeListener(FileObject previousPrimary) {
if (previousPrimary != null) {
previousPrimary.removeFileChangeListener(fileChangeListener);
}
getPrimaryEntry().getFile().addFileChangeListener(fileChangeListener);
}
// =================== Connections ====================================
public byte getSynchronizationType() {
Object o = getPrimaryFile().getAttribute(EA_CONNECTION);
return ((o != null) && (o instanceof Byte)) ?
((Byte)o).byteValue() : CONNECT_DEFAULT;
}
public void setSynchronizationType(byte type) {
FileObject fo = getPrimaryFile();
try {
if ((type != CONNECT_CONFIRM) && (type != CONNECT_NOT) && (type != CONNECT_AUTO))
throw new IllegalArgumentException();
fo.setAttribute(EA_CONNECTION, (type == CONNECT_DEFAULT) ? null : new Byte(type));
}
catch (IOException e) {
}
}
int getAllListenersMask() {
if (!JavaConnections.SETTINGS.isEnabled()) // disabled
return 0;
Iterator it = connectionSupport.getRegisteredTypes().iterator();
int mask = 0;
while (it.hasNext()) {
Object o = it.next();
if (o instanceof JavaConnections.Type) {
mask |= ((JavaConnections.Type)o).getFilter();
}
// temporary-begin-------
mask |= JavaConnections.IMPLEMENTS.getFilter();
// end ------------------
}
return mask;
}
private ConnectionCookie.Listener connectionListener = new ConnectionCookie.Listener() {
public void notify(final ConnectionCookie.Event event) throws IllegalArgumentException, ClassCastException {
JavaConnections.Event javaEvt = null;
boolean shouldPerform = false;
if (event instanceof JavaConnections.Event) {
javaEvt = (JavaConnections.Event)event;
shouldPerform = javaEvt.getType().overlaps(
new JavaConnections.Type(JavaConnections.TYPE_SOURCE_CHECK_DEEP | JavaConnections.TYPE_SOURCE_CHECK_SELF));
}
if (!JavaConnections.SETTINGS.isEnabled() && !shouldPerform)
return;
// Sync is rejected if synchronization is disabled and the event is not an explicit
// request for self-check.
if ((getSynchronizationType() == CONNECT_NOT) && !shouldPerform)
return;
SourceElementImpl.PARSING_RP.post(new Runnable() {
public void run() {
LinkedList changeProcessors = new LinkedList();
if (connectionNotify(event, changeProcessors)) {
// PEDNING
// this should be changed - asynchronous starting connectionNotify method can't
// throw IllegalArgumentException to the notify method.
// throw new IllegalArgumentException();
}
startChangeProcessors(changeProcessors);
}
});
}
};
void startChangeProcessors(LinkedList changeProcessors) {
if (changeProcessors.size() > 0) {
if (getSynchronizationType() == CONNECT_AUTO) {
Iterator it = changeProcessors.iterator();
while (it.hasNext()) {
JavaConnections.ChangeProcessor p = (JavaConnections.ChangeProcessor) it.next();
try {
p.process();
} catch (SourceException e) {
// eat the exception
// TopManager.getDefault().notify(new NotifyDescriptor.Exception(e));
}
}
}
else { // CONNECT_CONFIRM
byte oldSynch = getSynchronizationType();
byte newSynch = JavaConnections.showChangesDialog(changeProcessors, oldSynch);
if (oldSynch != newSynch)
setSynchronizationType(newSynch);
}
}
}
protected boolean connectionNotify(ConnectionCookie.Event event, LinkedList changeProcessors) {
if (event.getType().getEventClass().isAssignableFrom(JavaConnections.Event.class)) {
// there are two main sources of notification: external notifications that something this source
// depends on has changed, and explicit notifications that this source should check itself for changes.
JavaConnections.Event evt = (JavaConnections.Event)event;
boolean selfcheck = evt.getType().overlaps(new JavaConnections.Type(JavaConnections.TYPE_SOURCE_CHECK_DEEP | JavaConnections.TYPE_SOURCE_CHECK_SELF));
if (selfcheck) {
return InterfaceConnection.sourceCheck(changeProcessors, sourceElementImpl);
} else {
return InterfaceConnection.synchronizeInterfaces((JavaConnections.Event) event, changeProcessors, sourceElementImpl);
}
}
return false;
}
protected void registerForName(Identifier id, JavaConnections.Type type) {
registration(id, type, true);
}
protected void unregisterForName(Identifier id, JavaConnections.Type type) {
registration(id, type, false);
}
private void registration(final Identifier id, final JavaConnections.Type type, final boolean register) {
// check the excludes - the interfaces which are supposed to be stable ("java.*" and "javax.*") // NOI18N
final String name = id.getFullName();
for (int i = 0; i < SKIP_REGISTRATION_PREFIX.length; i++) {
if (name.startsWith(SKIP_REGISTRATION_PREFIX[i]))
return;
}
SourceElementImpl.PARSING_RP.post(new Runnable() {
public void run() {
try {
ClassElement sourceClass = ClassElement.forName(name);
if (sourceClass == null)
return;
ConnectionCookie cookie = (ConnectionCookie)sourceClass.getCookie(ConnectionCookie.class);
if (cookie == null)
return;
if (register)
cookie.register(type, getNodeDelegate());
else
cookie.unregister(type, getNodeDelegate());
}
catch (Exception e) {
if (Boolean.getBoolean("netbeans.debug.exceptions")) { // NOI18N
e.printStackTrace();
}
}
}
});
}
/** Set whether this object is considered modified.
* @param modif <code>true</code> to consider it modified
*/
public void setModified(boolean modif) {
super.setModified(modif);
if (modif)
sourceElementImpl.setDirty(modif);
}
/** Starts the task which update source element
* depending on the new name and location of the JavaDataObject.
* @param jdo The javadataobject which should be updated
* @param dest The current primary file object
* @param oldName The previous name of the object
* @param save If document should be saved after updating
*/
static void updateSourceStart(final JavaDataObject jdo,
final FileObject dest,
final String oldName, final boolean save) {
Task task = jdo.getSourceElementImpl().prepare();
task.addTaskListener(new TaskListener() {
public void taskFinished(Task t) {
updateSource(jdo, dest, oldName, save);
}
});
}
/** Update package and name of mail class in the source
* depending on the new name and location of the JavaDataObject.
* @param jdo The javadataobject which should be updated
* @param dest The current primary file object
* @param oldName The previous name of the object
* @param save If document should be saved after updating
*/
static void updateSource(JavaDataObject jdo, FileObject dest, String oldName, boolean save) {
try {
if (!jdo.isValid() || !dest.isValid()) {
return;
}
SourceElementImpl impl = jdo.getSourceElementImpl();
boolean wasLoaded = jdo.editorSupport.isDocumentLoaded();
// update package
FileObject packFO = dest.getParent();
Identifier oldPackage = impl.getPackage();
Identifier newPackage = (packFO.isRoot()) ? null : Identifier.create(packFO.getPackageName('.'));
if ((oldPackage != newPackage) ||
(oldPackage != null) && !oldPackage.equals(newPackage)) {
impl.setPackage(newPackage);
}
// update class rename
ClassElement[] classes = impl.getClasses();
if (!dest.getName().equals(oldName)) {
for (int i = 0; i < classes.length; i++) {
if (classes[i].getName().getName().equals(oldName)) {
StringBuffer fullName = new StringBuffer(packFO.getPackageName('.'));
if (fullName.length() > 0)
fullName.append('.');
fullName.append(dest.getName());
classes[i].setName(Identifier.create(fullName.toString(), dest.getName()));
break;
}
}
}
if (save) {
SaveCookie savec = (SaveCookie) jdo.getCookie(SaveCookie.class);
if (savec != null) {
savec.save();
}
if (!wasLoaded) {
jdo.editorSupport.close();
}
}
}
catch (SourceException e) {
}
catch (IOException e) {
}
}
// ==================== Handle methods =======================
/* Copies primary and secondary files to new folder.
* May ask for user confirmation before overwriting.
* @param df the new folder
* @return data object for the new primary
* @throws IOException if there was a problem copying
* @throws UserCancelException if the user cancelled the copy
*/
protected synchronized DataObject handleCopy (final DataFolder df) throws IOException {
DataObject obj = super.handleCopy(df);
if (obj instanceof JavaDataObject) {
String oldName = getPrimaryFile().getName();
JavaDataObject jdo = (JavaDataObject)obj;
updateSourceStart(jdo, jdo.getPrimaryFile(), oldName, true);
}
return obj;
}
/* Renames all entries and changes their files to new ones.
*/
protected FileObject handleRename (String name) throws IOException {
if (!Utilities.isJavaIdentifier(name))
throw new IOException(Util.getString("MSG_Not_Valid_FileName"));
boolean prevModif = isModified();
FileObject oldFo = getPrimaryFile();
String oldName = oldFo.getName();
FileObject fo = super.handleRename(name);
addSourceChangeListener(oldFo);
updateSourceStart(this, fo, oldName, !prevModif);
return fo;
}
/* Moves primary and secondary files to a new folder.
* May ask for user confirmation before overwriting.
* @param df the new folder
* @return the moved primary file object
* @throws IOException if there was a problem moving
* @throws UserCancelException if the user cancelled the move
*/
protected FileObject handleMove (DataFolder df) throws IOException {
boolean prevModif = isModified();
FileObject oldFo = getPrimaryFile();
String oldName = oldFo.getName();
FileObject fo = super.handleMove(df);
addSourceChangeListener(oldFo);
updateSourceStart(this, fo, oldName, !prevModif);
return fo;
}
/* Creates new object from template.
* @exception IOException
*/
protected DataObject handleCreateFromTemplate (DataFolder df, String name) throws IOException {
if (!Utilities.isJavaIdentifier(name))
throw new IOException(Util.getString("MSG_Not_Valid_FileName"));
DataObject obj = super.handleCreateFromTemplate(df, name);
if (obj instanceof JavaDataObject) {
String oldName = getPrimaryFile().getName();
JavaDataObject jdo = (JavaDataObject)obj;
updateSourceStart(jdo, jdo.getPrimaryFile(), oldName, true);
}
return obj;
}
/** Create the editor support for this data object.
* By default, creates a <code>JavaEditor</code> with the source file entry;
* subclasses may override this.
* @return the editor support
*/
protected JavaEditor createJavaEditor () {
return new JavaEditor (getPrimaryEntry ());
}
/* Help context for this object.
* @return help context
*/
public org.openide.util.HelpCtx getHelpCtx () {
return new org.openide.util.HelpCtx (JavaDataObject.class);
}
/** Provide node that should represent this data object.
* This implementation creates and returns a {@link JavaNode}.
* Subclasses may wish to return a specialized subclass of this node type.
* You should probably make the default action be {@link OpenAction}.
* @return the node representation for this data object
*/
protected Node createNodeDelegate () {
JavaNode node = new JavaNode (this);
node.setDefaultAction (SystemAction.get (OpenAction.class));
return node;
}
/** Get the parsed representation of this source file.
* May not be fully parsed yet; the source element itself indicates its status.
* @return the source element for this Java source file
*/
public SourceElement getSource() {
return sourceElement;
}
/**
* @return the SourceElementImpl for this java source.
*/
SourceElementImpl getSourceElementImpl() {
return sourceElementImpl;
}
/** Get the current editor support.
* Ought not be subclasses; use {@link #createJavaEditor}.
* @return the editor support
*/
public JavaEditor getJavaEditor() {
return editorSupport;
}
public ConnectionSupport getConnectionSupport() {
return connectionSupport;
}
private static JavaSettings getJavaSettings() {
if (jopts == null) {
jopts = (JavaSettings) JavaSettings.findObject(JavaSettings.class, true);
}
return jopts;
}
private static ExternalCompilerSettings getExternalCompilerSettings() {
if (ecopts == null) {
ecopts = (ExternalCompilerSettings) ExternalCompilerSettings.findObject(ExternalCompilerSettings.class, true);
}
return ecopts;
}
/** Create a compiler handling Java source files.
* Subclasses requiring special compilation support may override this
* (or may provide a {@link org.openide.compiler.Compiler.Manager} to do so).
* Or, subclasses may override it to retrieve the default compiler,
* then create postprocessors depending on it.
* @param job the job to add to
* @param type the class of compilation (e.g. <code>CompileCookie.Compile</code>)
* @return a compiler to handle this file
*/
protected Compiler createCompiler(CompilerJob job, Class type) {
return null;
}
/** Create a compiler handling Java source files.
*
*
* @param job the job to add to
* @param type the class of compilation (e.g. <code>CompileCookie.Compile</code>)
* @return a compiler to handle this file
*/
public static Compiler createCompilerForFileObject(Compiler[] dependencies,
CompilerJob job,
FileObject fo,
Class type) {
return null;
}
/** Remove a secondary entry from the list. Access method
* @param fe the entry to remove
*/
final void removeSecondaryEntryAccess(Entry fe) {
removeSecondaryEntry(fe);
}
// =============== implementation of ElementCookie ========================
/*
* Get the alternate node representation.
* @return the node
* @see org.openide.loaders.DataObject#getNodeDelegate
*/
public Node getElementsParent () {
if (alteranteParent != null) return alteranteParent;
synchronized (this) {
if (alteranteParent != null) return alteranteParent;
/* Changed for multiple factories
JavaElementNodeFactory cef = new JavaElementNodeFactory ();
cef.setGenerateForTree (true);
*/
ElementNodeFactory cef = getBrowserFactory();
SourceChildren sourceChildren = new SourceChildren (cef);
SourceElementFilter sourceElementFilter = new SourceElementFilter();
sourceElementFilter.setAllClasses (true);
sourceChildren.setFilter (sourceElementFilter);
sourceChildren.setElement (getSource ());
alteranteParent = new AbstractNode (sourceChildren);
CookieSet cs = alteranteParent.getCookieSet();
cs.add (sourceChildren);
return alteranteParent;
}
}
// =============== The mechanism for regeisteing node factories ==============
private static ArrayList explorerFactories = new ArrayList();
/**
* @associates JavaElementNodeFactory
*/
private static ArrayList browserFactories = new ArrayList();
static {
explorerFactories.add( JavaElementNodeFactory.DEFAULT );
JavaElementNodeFactory cef = new JavaElementNodeFactory();
cef.setGenerateForTree (true);
browserFactories.add( cef ) ;
}
public static void addExplorerFilterFactory( FilterFactory factory ) {
addFactory( explorerFactories, factory );
}
public static void removeExplorerFilterFactory( FilterFactory factory ) {
removeFactory( explorerFactories, factory );
}
static ElementNodeFactory getExplorerFactory( ) {
return (ElementNodeFactory)explorerFactories.get( explorerFactories.size() - 1);
}
public static void addBrowserFilterFactory( FilterFactory factory ) {
addFactory( browserFactories, factory );
}
public static void removeBrowserFilterFactory( FilterFactory factory ) {
removeFactory( browserFactories, factory );
}
static ElementNodeFactory getBrowserFactory() {
return (ElementNodeFactory)browserFactories.get( browserFactories.size() - 1 );
}
private static synchronized void addFactory( List factories, FilterFactory factory ) {
factory.attachTo( (ElementNodeFactory)factories.get( factories.size() - 1 ) );
factories.add( factory );
}
private static synchronized void removeFactory( List factories, FilterFactory factory ) {
int index = factories.indexOf( factory );
if ( index <= 0 )
return;
else if ( index == factories.size() - 1 )
factories.remove( index );
else {
((FilterFactory)factories.get( index + 1 )).attachTo( (ElementNodeFactory)factories.get( index - 1 ) );
factories.remove( index );
}
}
/*
public boolean isTemplate() {
if (!super.isTemplate()) {
return false;
}
if (isTemplateHelper != -1) {
return isTemplateHelper == 0 ? false : true;
}
FileObject primary = getPrimaryFile();
String ext = primary.getExt();
FileObject parent = getPrimaryFile().getParent();
FileObject fo = null;
String current;
current = primary.getName() + '_' + java.util.Locale.getDefault().toString();
int lastUnderbar = current.lastIndexOf('_');
while (lastUnderbar >= 1) {
fo = parent.getFileObject(current, ext);
if (fo != null) {
break;
}
current = current.substring(0, lastUnderbar);
lastUnderbar = current.lastIndexOf('_');
}
if (fo == null || fo == primary) {
isTemplateHelper = 1;
} else {
isTemplateHelper = 0;
}
return isTemplateHelper == 0 ? false : true;
}
*/
// =============== Instance ==========================
static class JavaInstanceSupport implements InstanceCookie {
MultiDataObject.Entry entry;
/** New support for given entry. The file is taken from the
* entry and is updated if the entry moves or renames itself.
* @param entry entry to create instance from
*/
public JavaInstanceSupport(MultiDataObject.Entry entry) {
this.entry = entry;
}
/* The class of the instance represented by this cookie.
* Can be used to test whether the instance is of valid
* class before it is created.
*
* @return the class of the instance
* @exception IOException an I/O error occured
* @exception ClassNotFoundException the class has not been found
*/
public Class instanceClass ()
throws java.io.IOException, ClassNotFoundException {
try {
// find class by class loader
Class clazz = findClass (instanceName ());
if (clazz == null)
throw new ClassNotFoundException ();
return clazz;
}
catch (Throwable t) {
if (t instanceof IOException)
throw (IOException) t;
else if (t instanceof ClassNotFoundException)
throw (ClassNotFoundException) t;
else if (t instanceof RuntimeException)
throw (RuntimeException) t;
else if (t instanceof ThreadDeath)
throw (ThreadDeath) t;
else
// turn other throwables into class not found ex.
throw new ClassNotFoundException(t.getMessage());
}
}
/* The bean name for the instance.
* @return the name for the instance
*/
public String instanceName () {
return entry.getFile().getPackageName ('.');
}
/*
* @return an object to work with
* @exception IOException an I/O error occured
* @exception ClassNotFoundException the class has not been found
*/
public Object instanceCreate ()
throws java.io.IOException, ClassNotFoundException {
try {
// create new instance
return instanceClass ().newInstance ();
}
catch (IOException ex) {
throw ex;
}
catch (ClassNotFoundException ex) {
throw ex;
}
catch (RuntimeException ex) {
throw ex;
}
catch (ThreadDeath t) {
throw t;
}
catch (Throwable t) {
// turn other throwables into class not found ex.
throw new ClassNotFoundException(t.getMessage());
}
}
/** Finds a class for given name.
* @param name name of the class
* @return the class for the name
* @exception ClassNotFoundException if the class cannot be found
*/
private Class findClass (String name) throws ClassNotFoundException {
try {
return Class.forName(name, true, TopManager.getDefault().currentClassLoader());
}
catch (ClassNotFoundException ex) {
throw ex;
}
catch (RuntimeException ex) {
throw ex;
}
catch (ThreadDeath t) {
throw t;
}
catch (Throwable t) {
// turn other throwables into class not found ex.
throw new ClassNotFoundException (t.getMessage ());
}
}
}
}
/*
* Log
* 85 Gandalf-post-FCS1.80.1.3 4/17/00 Svatopluk Dedic Sources are saved/closed
* soon after programmatic changes; bulk cross-package fixed.
* 84 Gandalf-post-FCS1.80.1.2 4/14/00 Svatopluk Dedic Listens for file changes
* when not opened as document and hierarchy is displayed.
* 83 Gandalf-post-FCS1.80.1.1 3/27/00 Svatopluk Dedic SourceExceptions ignored
* during automatic synchronization
* 82 Gandalf-post-FCS1.80.1.0 3/6/00 Svatopluk Dedic
* 81 Gandalf 1.80 2/15/00 Svatopluk Dedic Debug output commented
* out
* 80 Gandalf 1.79 2/14/00 Svatopluk Dedic
* 79 Gandalf 1.78 1/15/00 Petr Hamernik fixed #3964
* 78 Gandalf 1.77 1/13/00 Petr Hamernik i18n -(2nd round) -
* script bug fixed.
* 77 Gandalf 1.76 1/12/00 Petr Hamernik i18n: perl script used (
* //NOI18N comments added )
* 76 Gandalf 1.75 1/9/00 Petr Hamernik fixed 3262
* 75 Gandalf 1.74 1/9/00 Petr Hamernik fixed 4859
* 74 Gandalf 1.73 1/8/00 Petr Hamernik fixed 2829
* 73 Gandalf 1.72 12/20/99 Ales Novak JavaDO has new
* properties - default executor and default debugger
* 72 Gandalf 1.71 11/9/99 Ales Novak CoronaEnvironment kept
* through WeakReference
* 71 Gandalf 1.70 10/23/99 Ian Formanek NO SEMANTIC CHANGE - Sun
* Microsystems Copyright in File Comment
* 70 Gandalf 1.69 10/7/99 Petr Hamernik fixed bugs #2946, #3621
* - cookies changes of JavaDO (e.g.save) is propagated to all
* ElementNodes
* 69 Gandalf 1.68 10/7/99 Petr Hamernik Java module has its own
* RequestProcessor for source parsing.
* 68 Gandalf 1.67 9/30/99 Petr Hamernik dispose removed
* 67 Gandalf 1.66 9/29/99 Ales Novak CompilerType used
* 66 Gandalf 1.65 9/10/99 Petr Hamernik skip synchronization
* with java.* and javax.* interfaces
* 65 Gandalf 1.64 8/6/99 Petr Hamernik Working with threads
* improved
* 64 Gandalf 1.63 8/5/99 Ales Novak CompilerSupport.Clean
* cookie added
* 63 Gandalf 1.62 7/23/99 Petr Hamernik dispose() method added
* 62 Gandalf 1.61 7/23/99 Petr Hamernik java connection changes
* 61 Gandalf 1.60 7/9/99 Petr Hrebejk Add/Remove factory
* methods made synchronized
* 60 Gandalf 1.59 7/8/99 Petr Hamernik changes reflecting
* org.openide.src changes
* 59 Gandalf 1.58 7/3/99 Petr Hamernik SourceCookie.Editor -
* 1st version
* 58 Gandalf 1.57 6/30/99 Ales Novak CORBA support
* 57 Gandalf 1.56 6/28/99 Petr Hrebejk Multiple node factories
* added
* 56 Gandalf 1.55 6/24/99 Jesse Glick Gosh-honest HelpID's.
* 55 Gandalf 1.54 6/22/99 Petr Hamernik connecting to interfaces
* in RequestProcessor
* 54 Gandalf 1.53 6/22/99 Ian Formanek employed DEFAULT_HELP
* 53 Gandalf 1.52 6/10/99 Petr Hamernik last change improved
* 52 Gandalf 1.51 6/10/99 Petr Hamernik Instance support
* improved
* 51 Gandalf 1.50 6/10/99 Petr Hamernik simple InstanceSupport
* added to CookieSet
* 50 Gandalf 1.49 6/9/99 Ian Formanek ---- Package Change To
* org.openide ----
* 49 Gandalf 1.48 6/5/99 Petr Hamernik small improvement
* 48 Gandalf 1.47 6/4/99 Petr Hamernik synchronization update
* 47 Gandalf 1.46 6/2/99 Petr Hamernik connections of java
* sources
* 46 Gandalf 1.45 5/19/99 Jan Jancura Keep reference to
* ElementNode
* 45 Gandalf 1.44 5/17/99 Petr Hamernik missing implementation
* added
* 44 Gandalf 1.43 5/14/99 Petr Hamernik fixed bugs #1738 and
* #1756
* 43 Gandalf 1.42 5/13/99 Petr Hamernik changes in comparing
* Identifier, Type classes
* 42 Gandalf 1.41 5/12/99 Petr Hamernik ide.src.Identifier
* changed
* 41 Gandalf 1.40 5/11/99 Ales Novak PrintSupport removed
* 40 Gandalf 1.39 5/6/99 Jesse Glick [JavaDoc]
* 39 Gandalf 1.38 4/28/99 Petr Hamernik printing support
* 38 Gandalf 1.37 4/28/99 Petr Hamernik simple synchronization
* using ConnectionCookie
* 37 Gandalf 1.36 4/21/99 Petr Hamernik debugs removed
* 36 Gandalf 1.35 4/21/99 Petr Hamernik Java module updated
* 35 Gandalf 1.34 4/15/99 Martin Ryzl JavaDataObject.createCompiler
* added
* 34 Gandalf 1.33 4/13/99 Petr Hamernik SourceCookie added to
* CookieSet
* 33 Gandalf 1.32 4/13/99 Ales Novak Parsing during startup
* fix.
* 32 Gandalf 1.31 4/8/99 Ales Novak
* 31 Gandalf 1.30 4/2/99 Jan Jancura ObjectBrowser support
* II.
* 30 Gandalf 1.29 4/1/99 Ian Formanek Rollback to make it
* compilable
* 29 Gandalf 1.28 4/1/99 Jan Jancura Object Browser support
* 28 Gandalf 1.27 3/31/99 Ales Novak
* 27 Gandalf 1.26 3/29/99 Petr Hamernik
* 26 Gandalf 1.25 3/29/99 Ian Formanek removed import of
* modules.compiler
* 25 Gandalf 1.24 3/24/99 Ian Formanek Added protected method
* getJavaEditor to allow FormEditor to redefine the editing behavior
* 24 Gandalf 1.23 3/19/99 Ales Novak
* 23 Gandalf 1.22 3/10/99 Petr Hamernik
* 22 Gandalf 1.21 2/12/99 Petr Hamernik
* 21 Gandalf 1.20 2/11/99 Petr Hamernik
* 20 Gandalf 1.19 2/11/99 Petr Hamernik
* 19 Gandalf 1.18 2/11/99 Petr Hamernik
* 18 Gandalf 1.17 2/8/99 Petr Hamernik
* 17 Gandalf 1.16 2/8/99 Petr Hamernik
* 16 Gandalf 1.15 2/4/99 Petr Hamernik
* 15 Gandalf 1.14 2/4/99 Petr Hamernik
* 14 Gandalf 1.13 1/29/99 Petr Hamernik
* 13 Gandalf 1.12 1/27/99 Petr Hamernik
* 12 Gandalf 1.11 1/26/99 Petr Hamernik
* 11 Gandalf 1.10 1/26/99 Petr Hamernik
* 10 Gandalf 1.9 1/26/99 Petr Hamernik
* 9 Gandalf 1.8 1/21/99 Petr Hamernik
* 8 Gandalf 1.7 1/20/99 Petr Hamernik
* 7 Gandalf 1.6 1/15/99 Petr Hamernik
* 6 Gandalf 1.5 1/13/99 Petr Hamernik
* 5 Gandalf 1.4 1/7/99 Ian Formanek
* 4 Gandalf 1.3 1/7/99 Ian Formanek
* 3 Gandalf 1.2 1/6/99 Ian Formanek Reflecting change in
* datasystem package
* 2 Gandalf 1.1 1/6/99 Ales Novak
* 1 Gandalf 1.0 1/5/99 Ian Formanek
* $
* Beta Change History:
* 0 Tuborg 0.11 --/--/98 Jaroslav Tulach Changed number of parameters in constructor
* 0 Tuborg 0.13 --/--/98 Jan Formanek Icon change
* 0 Tuborg 0.16 --/--/98 Jan Formanek reflecting changes in cookies
* 0 Tuborg 0.17 --/--/98 Jan Formanek templates
*/